home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
oh!.2hd
/
OH!DEN_B.LZH
/
TOOLS
/
DC_VIEW
/
NEXTFILE.C
< prev
Wrap
Text File
|
1995-03-20
|
14KB
|
516 lines
/******************************************************************************
* nextfile.c: 下層テキストのロード処理
******************************************************************************
*
*
*/
#include <zmusic.h>
#include <direct.h>
#include <stdio.h>
#include <iocslib.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <stat.h>
#include <io.h>
#include <jfctype.h>
#include <doslib.h>
#include <direct.h>
#include <event.h> /* イベントマンを利用するときに必要 */
#include <sxgraph.h> /* グラフ系マネージャを利用するときに必要 */
#include <window.h> /* ウィンドウマンを利用するときに必要 */
#include <control.h> /* コントロールマンを利用するときに必要 */
#include <dialog.h> /* ダイアログマンを利用するときに必要 */
#include <task.h> /* タスクマンを利用するときに必要 */
#include "DC.h" /* このプログラム固有のヘッダファイル */
/******************************************************************************
* nextfile(): 下層テキストのロード
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void nextfile(ComVal *pcv)
{
char buff[256],buffm[512],buff2[512];
char tempfname[90],taskfname[90],comexe[90],execfname[90];
LPoint mpos;
int comline,err = 0,i,res;
char *txtPt,*comPt;
int *txtNo;
FILE *fn;
void **pcm;
char *dmy;
long fileLen;
char drv[TS_NAMEMAX],path[TS_NAMEMAX],node[TS_NAMEMAX],ext[TS_NAMEMAX];
char mdrv[TS_NAMEMAX];
IcState *icon;
char com[256];
int comNo;
char command[90];
char param[90];
char destfname[90];
char docfname[90];
char newfname[90];
char docPath[90];
int type; /* 1:doc,2:pcm,3:opm,4:ede,5:exe,6:cli */
com[0] = 0;
path[0] = 0;
command[0] = 0;
param[0] = 0;
destfname[0] = 0;
docfname[0] = 0;
newfname[0] = 0;
docPath[0] = 0;
mpos = EMMSLoc();
comline = pcv->ofset + LOWWORD(mpos) / 12;
if (pcv->Maxline < comline)
return;
MMHdlLock(pcv->txt); /* テキストブロックのハンドルをロック */
MMHdlLock(pcv->txtNo);
txtPt = *(pcv->txt);
txtNo = *(pcv->txtNo);
txtPt = txtPt + *(txtNo + comline);
if (!strncmp(txtPt, "◎", 2)) { /* コマンドラインか? */
while(strncmp(txtPt, "TYPE=", 5)) {
if (*txtPt == 13) {
err = 1;
break;
}
txtPt++;
}
if (err) return;
comPt = &buff[0];
while(*txtPt != 13) {
*comPt++ = *txtPt++;
}
*comPt = 0;
comPt = &buff[0] + 5;
while(*comPt != 0) { /* '/' なんか使うなよ */
if (*comPt == '/')
*comPt = '\\';
comPt++;
}
comPt = &buff[0] + 5;
if (!strncmp(comPt, "DOC", 3)) { /* TYPEの設定 */
type = 1;
} else if (!strncmp(comPt, "PCM", 3)) {
type = 2;
} else if (!strncmp(comPt, "OPM", 3)) {
type = 3;
} else if (!strncmp(comPt, "EDE", 3)) {
type = 4;
} else if (!strncmp(comPt, "EXE", 3)) {
type = 5;
} else if (!strncmp(comPt, "CLI", 3)) {
type = 6;
} else {
type = 99;
}
comPt = comPt + 3;
readcom(pcv, comPt, type, path, command, param, destfname, docfname, docPath);
switch(type) {
case 1: /* DOCの場合 */
strcpy(&(pcv->pastFname[pcv->pastFno][0]),
pcv->currentFname);
pcv->pastofset[pcv->pastFno] = pcv->ofset;
strcpy(&(pcv->pastPath[pcv->pastFno][0]),
pcv->currentPath);
structfname(pcv, path, docfname, pcv->currentFname);
strcpy(pcv->currentPath, docPath);
if (GetData(pcv, pcv->currentFname)) {
pcv->pastFno = pcv->pastFno + 1;
CMShine(pcv->btn12Hdl,C_ACTIVE);
drawGraph(pcv, 0);
} else {
strcpy(pcv->currentFname,
&(pcv->pastFname[pcv->pastFno][0]));
strcpy(pcv->currentPath,
&(pcv->pastPath[pcv->pastFno][0]));
pcv->errorCode = 0;
return;
}
break;
case 2: /* PCMの場合 */
structfname(pcv, path, docfname, tempfname);
fn = fopen(tempfname, "rb");
if (fn == NULL) {
DMError(D_CONFIRM,"File not found!");
return;
}
if (!pcv->pcmTask) {
fseek(fn, -1, SEEK_END);
fileLen = ftell(fn); /* ファイルサイズを求める */
fseek(fn, 0, SEEK_SET);
pcm =NULL;
pcm = MMChHdlNew(fileLen); /* PCMメモリ確保 */
if (pcm == NULL) {
DMError(D_CONFIRM | D_RED,
"メモリが確保できません!");
fclose(fn);
return;
}
MMHdlLock(pcm);
fread(*pcm, sizeof(char), (size_t) (fileLen), fn);
fclose(fn);
MMHdlUnlock(pcm);
ADPCMOUT(*pcm, 4*256+3, fileLen);
MMHdlDispose(pcm);
} else {
fclose(fn);
command[0] = sprintf(&command[1], "%s %s", pcv->pcmOpt, tempfname);
pcv->pcmTask = TSFockB(0, 0, pcv->pcmFname, command, 0, execfname);
if (pcv->pcmTask < 0) {
sprintf(command ,"%s:が見つかりません!", pcv->pcmFname);
DMError(D_CONFIRM, command);
pcv->pcmTask = 0;
return;
}
}
break;
case 3: /* OPMの場合 */
if (!LOWWORD(zm_ver())) {
DMError(D_CONFIRM, "ZMUSIC が常駐していません!");
return;
}
structfname(pcv, path, docfname, tempfname);
fn = fopen(tempfname, "rt");
if (fn == NULL) {
DMError(D_CONFIRM,"File not found!");
return;
}
if (!pcv->mzTask) {
EMEnCross();
while(1) {
fgets(buffm, 512, fn); /* 一行読み込み */
if (buffm[0] == 0)
break;
if (!strncmp(strlwr(buffm),
".adpcm_block_data", 17)) {
for(i=17;i<256;i++) {
if ((buffm[i] != ' ') &&
(buffm[i] != '=') &&
(buffm[i] != 9))
break;
}
strsfn(tempfname,drv,path,node,ext);
strcpy(mdrv, drv);
strcat(mdrv, path);
buff2[0] = 0;
strncpy(buff2, buffm, 17);
buff2[17] = 0;
strcat(buff2, " ");
strcat(buff2, mdrv);
strcat(buff2, "\\");
strcat(buff2, &buffm[i]);
/* DMError(D_CONFIRM,buff2); */
exec_zms(buff2);
} else {
exec_zms(buffm);
}
}
fclose(fn);
EMDeCross();
} else {
fclose(fn);
command[0] = sprintf(&command[1], "%s %s", pcv->mzOpt, tempfname);
pcv->mzTask = TSFockB(0, 0, pcv->mzFname, command, 0, execfname);
if (pcv->mzTask < 0) {
sprintf(command ,"%s:が見つかりません!", pcv->mzFname);
DMError(D_CONFIRM, command);
pcv->mzTask = 0;
return;
}
strcpy(pcv->zmsfname, tempfname);
}
pcv->mloadFlag = 1;
CMShine(pcv->btn10Hdl,C_ACTIVE);
CMShine(pcv->btn11Hdl,C_ACTIVE);
break;
case 4: /* EDEの場合 */
strcpy(&(pcv->pastFname[pcv->pastFno][0]),
pcv->currentFname);
pcv->pastofset[pcv->pastFno] = pcv->ofset;
strcpy(&(pcv->pastPath[pcv->pastFno][0]),
pcv->currentPath);
structfname(pcv, path, destfname, taskfname);
if (!strncmp(command, "PIC", 3) && pcv->picTask) {
if (strchr(taskfname, '.') == 0)
strcat(taskfname, ".PIC");
command[0] = sprintf(&command[1], "%s %s", pcv->picOpt, taskfname);
pcv->picTask = TSFockB(0, 0, pcv->picFname, command, 0, execfname);
if (pcv->picTask < 0) {
sprintf(command ,"%s:が見つかりません!", pcv->picFname);
DMError(D_CONFIRM, command);
pcv->picTask = 0;
}
}
structfname(pcv, path, docfname, pcv->currentFname);
strcpy(pcv->currentPath, docPath);
if (GetData(pcv, pcv->currentFname)) {
pcv->pastFno = pcv->pastFno + 1;
CMShine(pcv->btn12Hdl,C_ACTIVE);
drawGraph(pcv, 0);
} else {
strcpy(pcv->currentFname,
&(pcv->pastFname[pcv->pastFno][0]));
strcpy(pcv->currentPath,
&(pcv->pastPath[pcv->pastFno][0]));
pcv->errorCode = 0;
return;
}
break;
case 5: /* EXE,CLIの場合 */
case 6:
if (!strncmp(command, "PIC", 3) && pcv->picTask) {
structfname(pcv, path, destfname, taskfname);
if (strchr(taskfname, '.') == 0)
strcat(taskfname, ".PIC");
command[0] = sprintf(&command[1], "%s %s", pcv->picOpt, taskfname);
pcv->picTask = TSFockB(0, 0, pcv->picFname, command, 0, execfname);
}
break;
}
}
MMHdlUnlock(pcv->txtNo); /* テキストブロックのハンドルをアンロック */
MMHdlUnlock(pcv->txt);
}
int readcom(ComVal *pcv, char *comPt, int type, char *path, char *command, char *param, char *destfname, char *docfname, char *docPath)
{
int i, comlen, partlen;
char *doc;
char buff[90];
*path = 0;
*command = 0;
*param = 0;
*destfname = 0;
*docfname = 0;
if (*comPt == ';') { /* カレントパスの変更 */
comPt++;
if (strncmp(comPt, "CD=", 3) == 0) {
comPt = comPt + 3;
if (*comPt == '\\') {
if (!strncmp(pcv->currentFname, pcv->a_drv, strlen(pcv->a_drv)))
sprintf(buff, "A:%s", comPt);
else
sprintf(buff, "B:%s", comPt);
strcpy(comPt,buff);
}
i = 0;
while(1) {
if (*(comPt + i) == ':')
if (*(comPt + i + 1) != '\\')
break;
i++;
}
strncpy(path, comPt, i);
path[i] = 0;
comPt = comPt + i;
if (type == 1 || type == 4)
structfname(pcv, path, "", docPath);
} else {
while(*comPt != ':') {
comPt++;
}
}
} else {
strcpy(docPath, pcv->currentPath);
}
if (*comPt == ':') { /* コマンドライン解析 */
comPt++;
while(*comPt == '+' || *comPt == '-' || *comPt == '*' || *comPt == ':') {
comPt++;
}
if (*comPt == '\\') {
if (!strncmp(pcv->currentFname, pcv->a_drv, strlen(pcv->a_drv)))
sprintf(buff, "A:%s", comPt);
else
sprintf(buff, "B:%s", comPt);
strcpy(comPt,buff);
}
switch(type) {
case 1: /* DOC,PCM,OPM */
case 2:
case 3:
strcpy(docfname, comPt);
break;
case 4: /* EDE */
doc = strchr(comPt, ';');
if (doc == NULL)
break;
partlen = strlen(comPt) - strlen(doc);
strncpy(buff, comPt, partlen);
buff[partlen] = 0;
apartcom(pcv, buff, command, param, destfname);
doc++;
if (*doc == '\\') {
if (!strncmp(pcv->currentFname, pcv->a_drv, strlen(pcv->a_drv)))
sprintf(buff, "A:%s", doc);
else
sprintf(buff, "B:%s", doc);
strcpy(doc,buff);
}
strcpy(docfname, doc);
break;
case 5: /* EXE,CLI */
case 6:
apartcom(pcv, comPt, command, param, destfname);
break;
}
}
}
int apartcom(ComVal *pcv, char *comPt, char *command, char *param, char *destfname)
/* EXE,CLIの場合のコマンドの抽出
* パイプライン処理の場合は最後のコマンドのみ抽出する。
*/
{
int i, i1, i2, i3, comlen;
char buff[90];
param[0] = 0;
comlen = strlen(comPt);
for(i=comlen;i>0;i--) {
if (*(comPt + i) == ' ')
break;
}
if (i == 0 || *(comPt + i) == ':') {
strcpy(command, comPt + i);
destfname[0] = 0;
} else {
i1=i;
i2=i;
i3=i;
for(i=i;i>0;i--) {
if (*(comPt + i) == ' ')
i2=i;
if (*(comPt + i) == ':' || *(comPt + i - 1) == '|')
break;
}
if (i == 0) {
strncpy(command, comPt, i2);
command[i2] = 0;
} else if (i2 == i3) {
strncpy(command, comPt + i, i2 - i);
command[i2 - i] = 0;
} else {
strncpy(command, comPt + i, i2 - i);
command[i2++ - i] = 0;
strncpy(param, comPt + i2, i3 - i2);
param[i3 - i2] = 0;
}
comPt = comPt + i3 + 1;
if (*comPt == '\\') {
if (!strncmp(pcv->currentFname, pcv->a_drv, strlen(pcv->a_drv)))
sprintf(buff, "A:%s", comPt);
else
sprintf(buff, "B:%s", comPt);
strcpy(comPt,buff);
}
strcpy(destfname, comPt);
}
}
int structfname(ComVal *pcv, char *newpath, char *name, char *newfname)
/* ファイルネームをカレントパスとnodeから作成する。
*/
{
char drv[90], path[90], node[90], ext[90];
if (!strncmp(name, "A:", 2)) {
sprintf(newfname, "%s\\%s", pcv->a_drv, &name[3]);
} else if (!strncmp(name, "B:", 2)){
sprintf(newfname, "%s\\%s", pcv->b_drv, &name[3]);
} else if (!strncmp(newpath, "A:", 2)) {
if (newpath[3] == 0) {
sprintf(newfname, "%s\\%s", pcv->a_drv, name);
} else {
sprintf(newfname, "%s\\%s\\%s", pcv->a_drv, &newpath[3], name);
}
} else if (!strncmp(newpath, "B:", 2)) {
if (newpath[3] == 0) {
sprintf(newfname, "%s\\%s", pcv->b_drv, name);
} else {
sprintf(newfname, "%s\\%s\\%s", pcv->b_drv, &newpath[3], name);
}
} else {
strsfn(pcv->currentPath, drv, path, node, ext);
if (*newpath != 0)
sprintf(newfname, "%s%s\\%s\\%s", drv, path, newpath, name);
else
sprintf(newfname, "%s%s\\%s", drv, path, name);
}
}
/******************************************************************************
* retpastf(): 元のテキストをロード
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void retpastf(ComVal *pcv)
{
int buff;
if (pcv->pastFno < 1)
return;
buff = pcv->mloadFlag;
pcv->pastFno = pcv->pastFno - 1;
strcpy(pcv->currentFname, &(pcv->pastFname[pcv->pastFno][0]));
strcpy(pcv->currentPath, &(pcv->pastPath[pcv->pastFno][0]));
GetData(pcv, pcv->currentFname);
pcv->mloadFlag = buff;
pcv->ofset = pcv->pastofset[pcv->pastFno];
CMValueSet(pcv->volHdl, pcv->ofset);
drawGraph(pcv, 0);
}
STR@ 3 EdEV 3.00 <